package icu.shaoyayu.common.web.exception;


import icu.shaoyayu.common.utll.R;
import icu.shaoyayu.common.utll.ReturnUtil;
import icu.shaoyayu.common.utll.exception.CustomExceptionType;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;

import java.util.LinkedHashMap;

/**
 * @author shaoyayu
 * 在相应给前端的数据进行最后的一次校验
 */
@ControllerAdvice
public class GlobalResponseAdvice implements ResponseBodyAdvice {
    @Override
    public boolean supports(MethodParameter methodParameter, Class aClass) {
        return true;
    }

    @Override
    public Object beforeBodyWrite(Object body,
                                  MethodParameter methodParameter,
                                  MediaType mediaType,
                                  Class aClass,
                                  ServerHttpRequest serverHttpRequest,
                                  ServerHttpResponse serverHttpResponse) {
        //如果响应结果是JSON数据类型
        if(mediaType.equalsTypeAndSubtype(
                MediaType .APPLICATION_JSON)){
            if (body instanceof R){
                //如果前端不能实现对响应的状态码400或者其他的状态码，建议不要开启，否则前后端分离的时候，这个地方会发生很多的错误
                /*serverHttpResponse.setStatusCode(HttpStatus.valueOf(
                        ((AjaxResponse)body).getCode()
                ));*/
                ((R) body).setTimestamp(System.currentTimeMillis());
                return body;
            } else if (body instanceof LinkedHashMap){
                //可能存在访问返回的404信息进行封装
                if (((LinkedHashMap<?, ?>) body).get("status").equals(404)){
                    return ReturnUtil.error(CustomExceptionType.RESOURCES_ARE_NOT_OPEN_ERROR);
                }
            }else  {
                return body;
            }
        }
        return body;
    }
}
